import requests
import pandas as pd
import time
import random

from const import companies, host_url, filter_words, specific_years
from szse_stock import szse_stock
# from json_data import json_data


# 存储公司和对应年报下载链接的字典
company_report_links = {}

# 通过公司名字找到公司代码
def get_company_info(company_name):
    for item in szse_stock["stockList"]:
        if item['zwjc'] == company_name:
            return {
                'code': item['code'] + ',' + item['orgId'],
                'column': item['column'],
                'plate': item['plate'],
            }
    return None


# 设置搜索年报的网站和搜索参数
search_annual_report_url = "http://www.cninfo.com.cn/new/hisAnnouncement/query"

# 获取年报接口的入参
def get_annual_report_params(company_info):
    # 获取公司代码
    form_data = {
        # 这里的搜索参数需要根据实际的搜索URL及其接受的参数来设置
        'stock': company_info['code'],
        'tabName': 'fulltext',
        'pageSize': 30,
        'pageNum': 1,
        'column': company_info['column'],
        'category': 'category_ndbg_szsh;',
        'plate': company_info['plate'],
        'seDate': '',
        'searchkey': '',
        'secid': '',
        'sortName': '',
        'sortType': '',
        'isHLtitle': True
    }
    return form_data


# 获取年报
def getReport(company_name):
    print("%s 公司 正在解析年报下载地址" % (company_name,))
    # 获取公司代码
    company_info = get_company_info(company_name)
    if not company_info:
        print("%s 公司代码获取失败" % (company_name,))
        return
    form_data = get_annual_report_params(company_info)
    print("%s 公司，正在年报请求" % (company_name,))
    response = requests.post(search_annual_report_url, data=form_data)
    print("%s 公司，结束年报请求" % (company_name,))
    # 检查响应状态码和内容
    if response.status_code == 200:
        print("%s 公司，年报请求成功" % (company_name,))
        # 成功处理响应内容
        json_data = response.json()  # 假设返回的是JSON格式数据
        annual_report_list = json_data["announcements"]
        if len(annual_report_list) > 0:
            print("%s 公司，开始解析年报" % (company_name,))
            filtered_announcements = [item for item in annual_report_list
                                        if not any(word in item["announcementTitle"] for word in filter_words)
                                        and any(year in item["announcementTitle"] for year in specific_years)]
            # 公司名称
            company_name = filtered_announcements[0]["secName"]
            company_report_links[company_name] = {}

            for year in specific_years:
                for report in filtered_announcements:
                    company_report_links[company_name]["name"] = company_name
                    if year in report["announcementTitle"]:
                        company_report_links[company_name][year] = host_url + "/" + report["adjunctUrl"]
                    else:
                        if company_report_links[company_name].get(year) is None:
                            company_report_links[company_name][year] = ""
            print("%s 公司，完成解析年报" % (company_name,))
        else:
            print("%s 公司，年报请求失败： %s" % (company_name, '无数据',))
    else:
        print("%s 公司，年报请求失败： %s" % (company_name, response.status_code,))


# 遍历所有公司
for company in companies:
    getReport(company)
    # 为了避免网站被封，延迟n秒
    time.sleep(random.uniform(3, 8))

# 将公司2010-2022的年报都保存到excel中
all_report = []
for every_company in company_report_links.values():
    all_report.append(every_company.values())

# 将结果转换为pandas DataFrame
df = pd.DataFrame(all_report, columns=['Company',]+specific_years)

# 导出到Excel文件
output_filename = 'company_annual_reports.xlsx'
df.to_excel(output_filename, index=False)

print(f'公司年报下载链接已导出到 {output_filename}')
